#ifndef __UART_H__
#define __UART_H__

#include "types.h"

// UART寄存器偏移地址
#define UART_RHR 0  // 接收保持寄存器
#define UART_THR 0  // 发送保持寄存器
#define UART_IER 1  // 中断使能寄存器
#define UART_FCR 2  // FIFO控制寄存器
#define UART_ISR 2  // 中断状态寄存器（与FCR共用地址，读写区分）
#define UART_LCR 3  // 线路控制寄存器
#define UART_LSR 5  // 线路状态寄存器

// 寄存器操作宏（简化地址计算）
#define UART_REG(reg) ((volatile uint8*)(UART0 + (reg)))
#define uart_read(reg)  (*UART_REG(reg))    // 读UART寄存器
#define uart_write(reg, val) (*UART_REG(reg) = (val))  // 写UART寄存器

// 寄存器控制位定义
#define UART_IER_RX_ENABLE  (1 << 0)  // 使能接收中断
#define UART_IER_TX_ENABLE  (1 << 1)  // 使能发送中断
#define UART_FCR_FIFO_EN    (1 << 0)  // 使能FIFO
#define UART_FCR_CLEAR_FIFO (3 << 1)  // 清空FIFO（接收+发送）
#define UART_LCR_EIGHT_BITS (3 << 0)  // 8位数据位
#define UART_LCR_BAUD_LATCH (1 << 7)  // 波特率锁存位（修改波特率时需置1）
#define UART_LSR_RX_READY   (1 << 0)  // 接收缓冲区有数据
#define UART_LSR_TX_IDLE    (1 << 5)  // 发送缓冲区空闲（可写入新数据）

// 函数声明
void uart_init(void);    // 初始化UART
void uart_putc(char c);  // 发送单个字符
int  uart_getc(void);    // 接收单个字符（无数据返回-1）

#endif
